package com.example.testanimation.graphics.matrix.image;

import android.util.Log;
import android.widget.GridLayout;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;

import com.scenic.rd_android.R;

public class MatrixTestForImage extends Activity {

	private static final String TAG = "MatrixTestForImage";
	private TransformMatrixView view;
    private GridLayout mGridLayout;

    protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		view = new TransformMatrixView(this);
		setContentView(view);

	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		System.out.println("onTouchEvent  ");

		return onTouch(view, event);
	}

	public boolean onTouch(View v, MotionEvent e) {
		if (e.getAction() == MotionEvent.ACTION_UP) {
			Matrix matrix = new Matrix();
			// doTranslator();

			// 2. 旋转(围绕图像的中心点)
			// doRotate(matrix);

			// 3. 旋转(围绕坐标原点) + 平移(效果同2)
			// doRotate_2(matrix);

			// 4. 缩放
			// doScale(matrix);

			// // 5. 错切 - 水平
			doSkew(matrix);

			// // 6. 错切 - 垂直
			doSkew_vertical(matrix);

			// 7. 错切 - 水平 + 垂直
			doSkew_hor_ve(matrix);

			// // 8. 对称 (水平对称)
			do_dui_chen(matrix);

			// // 9. 对称 - 垂直
			do_dui_chen_ver(matrix);

			// // 10. 对称(对称轴为直线y = x)
			do_duichen_2(matrix);

			view.invalidate();
		}

		return super.onTouchEvent(e);
	}

	protected void do_duichen_2(Matrix matrix) {
		// 10. 对称(对称轴为直线y = x)
		float matrix_values[] = { 0f, -1f, 0f, -1f, 0f, 0f, 0f, 0f, 1f };
		matrix.setValues(matrix_values);
		// 下面的代码是为了查看matrix中的元素
		float[] matrixValues = new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i < 3; ++i) {
			String temp = new String();
			for (int j = 0; j < 3; ++j) {
				temp += matrixValues[3 * i + j] + "\t";
			}
			Log.e(TAG, temp);
		}

		// 做下面的平移变换，纯粹是为了让变换后的图像和原图像不重叠
		matrix.postTranslate(view.getImageBitmap().getHeight() + view.getImageBitmap().getWidth(), view.getImageBitmap().getHeight() + view.getImageBitmap().getWidth());
		view.setImageMatrix(matrix);

		// 下面的代码是为了查看matrix中的元素
		matrixValues = new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i < 3; ++i) {
			String temp = new String();
			for (int j = 0; j < 3; ++j) {
				temp += matrixValues[3 * i + j] + "\t";
			}
			Log.e(TAG, temp);
		}
	}

	protected void do_dui_chen_ver(Matrix matrix) {
		// 9. 对称 - 垂直
		float matrix_values[] = { -1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f };
		matrix.setValues(matrix_values);
		// 下面的代码是为了查看matrix中的元素
		float[] matrixValues = new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i < 3; ++i) {
			String temp = new String();
			for (int j = 0; j < 3; ++j) {
				temp += matrixValues[3 * i + j] + "\t";
			}
			Log.e(TAG, temp);
		}

		// 做下面的平移变换，纯粹是为了让变换后的图像和原图像不重叠
		matrix.postTranslate(view.getImageBitmap().getWidth() * 2f, 0f);
		view.setImageMatrix(matrix);

		// 下面的代码是为了查看matrix中的元素
		matrixValues = new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i < 3; ++i) {
			String temp = new String();
			for (int j = 0; j < 3; ++j) {
				temp += matrixValues[3 * i + j] + "\t";
			}
			Log.e(TAG, temp);
		}
	}

	protected void do_dui_chen(Matrix matrix) {
		// 8. 对称 (水平对称)
		float matrix_values[] = { 1f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, 1f };
		matrix.setValues(matrix_values);
		// 下面的代码是为了查看matrix中的元素
		float[] matrixValues = new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i < 3; ++i) {
			String temp = new String();
			for (int j = 0; j < 3; ++j) {
				temp += matrixValues[3 * i + j] + "\t";
			}
			Log.e(TAG, temp);
		}

		// 做下面的平移变换，纯粹是为了让变换后的图像和原图像不重叠
		matrix.postTranslate(0f, view.getImageBitmap().getHeight() * 2f);
		view.setImageMatrix(matrix);

		// 下面的代码是为了查看matrix中的元素
		matrixValues = new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i < 3; ++i) {
			String temp = new String();
			for (int j = 0; j < 3; ++j) {
				temp += matrixValues[3 * i + j] + "\t";
			}
//			Log.e(TAG,"TestTransformMatrixActivity", temp.toString());
		}
	}

	protected void doSkew_hor_ve(Matrix matrix) {
		// 7. 错切 - 水平 + 垂直
		matrix.setSkew(0.5f, 0.5f);
		// 下面的代码是为了查看matrix中的元素
		float[] matrixValues = new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i < 3; ++i) {
			String temp = new String();
			for (int j = 0; j < 3; ++j) {
				temp += matrixValues[3 * i + j] + "\t";
			}
			Log.e("TestTransformMatrixActivity", temp);
		}

		// 做下面的平移变换，纯粹是为了让变换后的图像和原图像不重叠
		matrix.postTranslate(0f, view.getImageBitmap().getHeight());
		view.setImageMatrix(matrix);

		// 下面的代码是为了查看matrix中的元素
		matrixValues = new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i < 3; ++i) {
			String temp = new String();
			for (int j = 0; j < 3; ++j) {
				temp += matrixValues[3 * i + j] + "\t";
			}
			Log.e("TestTransformMatrixActivity", temp);
		}
	}

	protected void doSkew_vertical(Matrix matrix) {
		// 6. 错切 - 垂直
		matrix.setSkew(0f, 0.5f);
		// 下面的代码是为了查看matrix中的元素
		float[] matrixValues = new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i < 3; ++i) {
			String temp = new String();
			for (int j = 0; j < 3; ++j) {
				temp += matrixValues[3 * i + j] + "\t";
			}
			Log.e("TestTransformMatrixActivity", temp);
		}

		// 做下面的平移变换，纯粹是为了让变换后的图像和原图像不重叠
		matrix.postTranslate(0f, view.getImageBitmap().getHeight());
		view.setImageMatrix(matrix);

		// 下面的代码是为了查看matrix中的元素
		matrixValues = new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i < 3; ++i) {
			String temp = new String();
			for (int j = 0; j < 3; ++j) {
				temp += matrixValues[3 * i + j] + "\t";
			}
			Log.e("TestTransformMatrixActivity", temp);
		}
	}

	protected void doSkew(Matrix matrix) {
		// // 5. 错切 - 水平
		matrix.setSkew(0.5f, 0f);
		// 下面的代码是为了查看matrix中的元素
		float[] matrixValues = new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i < 3; ++i) {
			String temp = new String();
			for (int j = 0; j < 3; ++j) {
				temp += matrixValues[3 * i + j] + "\t";
			}
			Log.e("TestTransformMatrixActivity", temp);
		}

		// 做下面的平移变换，纯粹是为了让变换后的图像和原图像不重叠
		matrix.postTranslate(view.getImageBitmap().getWidth(), 0f);
		view.setImageMatrix(matrix);

		// 下面的代码是为了查看matrix中的元素
		matrixValues = new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i < 3; ++i) {
			String temp = new String();
			for (int j = 0; j < 3; ++j) {
				temp += matrixValues[3 * i + j] + "\t";
			}
			Log.e("TestTransformMatrixActivity", temp);
		}
	}

	protected void doScale(Matrix matrix) {
		// 4. 缩放
		matrix.setScale(2f, 2f);
		// 下面的代码是为了查看matrix中的元素
		float[] matrixValues = new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i < 3; ++i) {
			String temp = new String();
			for (int j = 0; j < 3; ++j) {
				temp += matrixValues[3 * i + j] + "\t";
			}
			Log.e("TestTransformMatrixActivity", temp);
		}

		// 做下面的平移变换，纯粹是为了让变换后的图像和原图像不重叠
		matrix.postTranslate(view.getImageBitmap().getWidth(), view.getImageBitmap().getHeight());
		view.setImageMatrix(matrix);

		// 下面的代码是为了查看matrix中的元素
		matrixValues = new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i < 3; ++i) {
			String temp = new String();
			for (int j = 0; j < 3; ++j) {
				temp += matrixValues[3 * i + j] + "\t";
			}
			Log.e("TestTransformMatrixActivity", temp);
		}
	}

	protected void doRotate_2(Matrix matrix) {
		// 3. 旋转(围绕坐标原点) + 平移(效果同2)
		// matrix.postTranslate(-1f * (float)view.getImageBitmap().getWidth() /
		// 2f, -1f * (float)view.getImageBitmap().getHeight() / 2f);
		// matrix.postRotate(45f);
		// matrix.postTranslate((float)view.getImageBitmap().getWidth() / 2f,
		// (float)view.getImageBitmap().getHeight() / 2f);

		matrix.setRotate(45f);
		matrix.preTranslate(-1f * view.getImageBitmap().getWidth() / 2f, -1f * view.getImageBitmap().getHeight() / 2f);
		matrix.postTranslate((float) view.getImageBitmap().getWidth() / 2f, (float) view.getImageBitmap().getHeight() / 2f);
		// 做下面的平移变换，纯粹是为了让变换后的图像和原图像不重叠
		matrix.postTranslate((float) view.getImageBitmap().getWidth() * 1.5f, 0f);
		view.setImageMatrix(matrix);

		// 下面的代码是为了查看matrix中的元素
		float[] matrixValues = new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i < 3; ++i) {
			String temp = new String();
			for (int j = 0; j < 3; ++j) {
				temp += matrixValues[3 * i + j] + "\t";
			}
			Log.e("TestTransformMatrixActivity", temp);
		}
	}

	protected void doRotate(Matrix matrix) {
		// 2. 旋转(围绕图像的中心点)
		matrix.setRotate(45f, view.getImageBitmap().getWidth() / 2f, view.getImageBitmap().getHeight() / 2f);

		// 做下面的平移变换，纯粹是为了让变换后的图像和原图像不重叠
		matrix.postTranslate(view.getImageBitmap().getWidth() * 1.5f, 0f);
		view.setImageMatrix(matrix);

		// 下面的代码是为了查看matrix中的元素
		float[] matrixValues = new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i < 3; ++i) {
			String temp = new String();
			for (int j = 0; j < 3; ++j) {
				temp += matrixValues[3 * i + j] + "\t";
			}
			Log.e("TestTransformMatrixActivity", temp);
		}
	}

	protected void doTranslator(Matrix matrix) {

		// 输出图像的宽度和高度(162 x 251)
		Log.e("TestTransformMatrixActivity", "image size: width x height = " + view.getImageBitmap().getWidth() + " x " + view.getImageBitmap().getHeight());
		// 1. 平移
		matrix.postTranslate(view.getImageBitmap().getWidth(), view.getImageBitmap().getHeight());
		// 在x方向平移view.getImageBitmap().getWidth()，在y轴方向view.getImageBitmap().getHeight()
		view.setImageMatrix(matrix);

		// 下面的代码是为了查看matrix中的元素
		float[] matrixValues = new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i < 3; ++i) {
			String temp = new String();
			for (int j = 0; j < 3; ++j) {
				temp += matrixValues[3 * i + j] + "\t";
			}
			Log.e("TestTransformMatrixActivity", temp);
		}
	}

	class TransformMatrixView extends ImageView {

		private Bitmap bitmap;
		private Matrix matrix;

		public TransformMatrixView(Context context) {
			super(context);
			bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.sample_5);
			matrix = new Matrix();
		}

		@Override
		protected void onDraw(Canvas canvas) {

			// 画出原图像
			canvas.drawBitmap(bitmap, 0, 0, null);
			// 画出变换后的图像
			canvas.drawBitmap(bitmap, matrix, null);
			super.onDraw(canvas);
		}

		@Override
		public void setImageMatrix(Matrix matrix) {
			this.matrix.set(matrix);
			super.setImageMatrix(matrix);
		}

		public Bitmap getImageBitmap() {
			return bitmap;
		}

	}
}
